/**
 * @file ConexionBD.java
 * Clase para conectar con la Base de Datos
 * 
 * La clase tiene los atributos necesarios para conectar con la Base de Datos
 * remota, o en caso de que esta falle con la base de datos local, y
 * los métodos para hacer consultas. Se implementa siguiendo el patrón de
 * Diseño "Singleton"
 * 
 * @author TecnoSoft
 * @version 2.0
 */

package ConexionBD;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class ConexionBD {

    private static final String USERNAME = "fcbgranada";
    private static final String PASSWORD = "isiii2013";
    private static final String HOST = "jdbc:mysql://db4free.net/fcbgranada";
    private static final String LOCALHOST_E = "jdbc:derby://DerbyLocalBD/fcbgranadaDB";
    private static final String driver_E = "org.apache.derby.jdbc.EmbeddedDriver";
    
    private static final String LOCALHOST = "jdbc:derby://localhost:1527/fcbGranadaBD";
    private static final String driver = "org.apache.derby.jdbc.ClientDriver";
    
    private static Connection conexion;
    private static Statement instruccion;
    private static ResultSet rs;
    private static ConexionBD Instancia = null;
     
    private ConexionBD(){}
    
    /**
     * Método que devuelve la única instancia de la clase
     * @param void
     * @return Instancia
     */
    public static ConexionBD getInstancia() {
        if (Instancia==null){
            Instancia = new ConexionBD();
        }
        return Instancia;
    }
    
    @Override
    /**
     * Sobrecarga del método clone para impedir que se duplique la instancia
     * (Exigencias del patrón Singleton)
     * @param void
     * @return Object
     */
    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException(); 
    }
    
    /**
     * Crea una conexion con la Base de Datos
     * @param void
     * @return void
     */
    public void conectar() {
        
        try {
            conexion = DriverManager.getConnection(HOST, USERNAME, PASSWORD);
            } catch (SQLException e) {
                try {
                    try {
                        Class.forName(driver);
                    }catch (ClassNotFoundException ex) {
                            System.err.println(ex);
                    }
                    conexion = DriverManager.getConnection(LOCALHOST, USERNAME, PASSWORD);
                } catch(SQLException ex){
                    System.err.println(e);
                    System.err.println(ex);
                }
            }
        try {
           instruccion = conexion.createStatement();  
        } catch (SQLException ex) {
                    System.err.println(ex);
        }
    }
 
    /**
     * Lanza una consulta a la Base de Datos del tipo SELECT
     * @param consulta - String con la consulta a hacer en la BD
     * @return ResultSet con los datos devueltos por la consulta
     */
    public ResultSet consultar(String consulta) throws SQLException {
        return instruccion.executeQuery(consulta);
    }
    
    /**
     * Lanza una consulta para modificar la Base de Datos
     * @param consulta - String con la consulta a hacer en la BD
     * @return ResultSet con los datos devueltos por la consulta
     */
    public ResultSet actualizar(String consulta) throws SQLException {
        instruccion.executeUpdate(consulta,Statement.RETURN_GENERATED_KEYS);
        return instruccion.getGeneratedKeys();
    }
    
    
    /**
     * Desconecta la conexion con la Base de Datos
     * @param void
     * @return void
     */
    public void desconectar(){
     try {
      if (instruccion != null) {
        instruccion.close();
      }
      if (conexion != null) {
        conexion.close();
      }
    } catch (Exception e) {
    }finally{
        instruccion=null;
        conexion= null;
     }
    }
}
